#include "pch.h"
#include "GuiEntity.h"
#include "WLEngine.h"
#include "UIWnd.h"
namespace WL
{
	DefineScriptClass(CGuiEntity)
	
	struct CWndCallBack : public CCallBack
	{
		CWndCallBack()
		{

		}
		CWndCallBack(void* pParameters)
			: CCallBack(pParameters)
		{
		}
		virtual ~CWndCallBack()
		{
			mpWnd = nullptr;
		}
		virtual void onRun(void* pParameters)
		{
		}
		CUIWnd* mpWnd = nullptr;
	};

	void CGuiEntity::registerClass()
	{
		CRegisterClass<CGuiEntity>::registerClass();
	}

	void CGuiEntity::registerMember()
	{
		CRegisterFun<bool>::registerClassMemberFun<CGuiEntity, bool(CGuiEntity::*)(const std::string&), &CGuiEntity::initialise, const std::string&>("initialise");
		CRegisterFun<void>::registerClassMemberFun<CGuiEntity, void(CGuiEntity::*)(const std::string&), &CGuiEntity::setLuaEntityName, const std::string&>("setLuaEntityName");
		CRegisterFun<void>::registerClassMemberFun<CGuiEntity, void(CGuiEntity::*)(bool), &CGuiEntity::setVisible, bool>("setVisible");
		CRegisterFun<bool>::registerClassMemberFun<CGuiEntity, bool(CGuiEntity::*)()const, &CGuiEntity::isVisible>("isVisible");
		
		CRegisterFun<void>::registerClassMemberFun<CGuiEntity, void(CGuiEntity::*)(const std::string&), &CGuiEntity::setText, const std::string&>("setText");
		CRegisterFun<void>::registerClassMemberFun<CGuiEntity, void(CGuiEntity::*)(UINT32, const std::string&), &CGuiEntity::setText, UINT32, const std::string&>("setChildText");
	}

	CGuiEntity::CGuiEntity()
	{
		mType = Gui;
		GEngine->addGuiEntity(this);
		setVisible(false);
	}

	CGuiEntity::~CGuiEntity()
	{
		if (GEngine)
		{
			GEngine->removeGuiEntity(this);
			WL_DECREASE(mpUIWnd);
		}
	}

	bool CGuiEntity::initialise(const std::string& szFile)
	{
		auto pWnd = dynamic_cast<CUIWnd*>(GEngine->createResource(szFile, ResourceType::Wnd));
		if( nullptr != pWnd )
		{
			WL_INCREASE(pWnd);
			WL_DECREASE(mpUIWnd)
			mpUIWnd = pWnd;

			CWndCallBack* pCallBack = new CWndCallBack(nullptr);
			pCallBack->mpWnd = this->mpUIWnd;
			pCallBack->mTimerID = 0;
			pCallBack->mAlternationTime = 5000;
			pCallBack->mRunCount = -1;
			GEngine->registerCall(pCallBack, -1);
			return true;
		}
		return false;
	}


	void CGuiEntity::setLuaEntityName(const std::string& szName)
	{
		mLuaTableName = szName;
	}

	void CGuiEntity::setX(float x)
	{
		if( nullptr != mpUIWnd )
		{
			auto v = mpUIWnd->getPosition();
			v.x = x;
			mpUIWnd->setPosition(v);
		}
	}

	void CGuiEntity::setY(float y)
	{
		if (nullptr != mpUIWnd)
		{
			auto v = mpUIWnd->getPosition();
			v.y = y;
			mpUIWnd->setPosition(v);
		}
	}

	void CGuiEntity::setWidth(float w)
	{
		if (nullptr != mpUIWnd)
		{
			auto size = mpUIWnd->getSize();
			size.x = w;
			mpUIWnd->setSize(size);
		}
	}

	void CGuiEntity::setHeight(float h)
	{
		if (nullptr != mpUIWnd)
		{
			auto size = mpUIWnd->getSize();
			size.x = h;
			mpUIWnd->setSize(size);
		}
	}

	void CGuiEntity::setVisible(bool bValue)
	{
		if (isVisible() != bValue)
		{
			CEntity::setVisible(bValue);
			GEngine->removeGuiEntity(this);
			GEngine->addGuiEntity(this);
		}
	}

	void CGuiEntity::setVisible(UINT32 Id, bool bValue)
	{
		if (nullptr != mpUIWnd)
		{
			auto pChild = mpUIWnd->getchild(Id);
			if (nullptr != pChild)
			{
				pChild->setVisible(bValue);
			}
		}
	}

	void CGuiEntity::setPosition(const Vec3F& pos)
	{
		if (nullptr != mpUIWnd)
		{
			mpUIWnd->setPosition(pos);
		}
	}

	void CGuiEntity::setPosition(UINT32 Id, const Vec3F& pos)
	{
		if( nullptr != mpUIWnd )
		{
			auto pChild = mpUIWnd->getchild(Id);
			if( nullptr != pChild )
			{
				pChild->setPosition(pos);
			}
		}
	}

	void CGuiEntity::setSize(UINT32 Id, const Vec2F& size)
	{
		if (nullptr != mpUIWnd)
		{
			auto pChild = mpUIWnd->getchild(Id);
			if (nullptr != pChild)
			{
				pChild->setSize(size);
			}
		}
	}

	void CGuiEntity::setSize(const Vec2F& szie)
	{
		if (nullptr != mpUIWnd)
		{
			mpUIWnd->setSize(szie);
		}
	}

	void CGuiEntity::setRotation(UINT32 Id, float fRadion)
	{
		if (nullptr != mpUIWnd)
		{
			auto pChild = mpUIWnd->getchild(Id);
			if (nullptr != pChild)
			{
				pChild->setRotation(fRadion);
			}
		}
	}

	void CGuiEntity::setRotation(float fRadion)
	{
		if( nullptr != mpUIWnd )
		{
			mpUIWnd->setRotation(fRadion);
		}
	}

	float CGuiEntity::getRotation() const
	{
		return mpUIWnd ? mpUIWnd->getRotation() : 0.0f;
	}

	float CGuiEntity::getRotation(UINT32 Id) const
	{
		if (nullptr != mpUIWnd)
		{
			auto pChild = mpUIWnd->getchild(Id);
			if (nullptr != pChild)
			{
				return pChild->getRotation();
			}
		}
		return 0.0f;
	}


	void CGuiEntity::setText(const std::string& szContent)
	{
		if (nullptr != mpUIWnd)
		{
			mpUIWnd->setText(szContent);
		}
	}

	void CGuiEntity::setText(UINT32 Id, const std::string& szContent)
	{
		if( nullptr != mpUIWnd )
		{
			auto pChild = mpUIWnd->getchild(Id);
			if( nullptr != pChild )
			{
				pChild->setText(szContent);
			}
		}
	}

	bool CGuiEntity::isVisible() const
	{
		return CEntity::isVisible();
	}

	bool CGuiEntity::isVisible(UINT32 id) const 
	{
		auto pWnd = mpUIWnd->getchild(id);
		return pWnd ? pWnd->isVisible() : false;
	}

}